package com.yaorange.nongjt.service.impl;

import com.yaorange.common.enums.YesOrNoEnum;
import com.yaorange.common.utils.file.FileUploadUtils;
import com.yaorange.nongjt.domain.NjtLoginUser;
import com.yaorange.nongjt.domain.NjtUnitConfig;
import com.yaorange.nongjt.domain.NjtUserPerfect;
import com.yaorange.nongjt.domain.NjtUserRegister;
import com.yaorange.nongjt.service.INjtUnitConfigService;
import com.yaorange.nongjt.service.INjtUserPerfectService;
import com.yaorange.nongjt.service.INjtUserRegisterService;
import com.yaorange.nongjt.vo.NjtCertificateVo;
import com.yaorange.common.constant.NjtConstants;
import com.yaorange.common.core.domain.entity.SysUser;
import com.yaorange.common.core.domain.model.LoginUser;
import com.yaorange.common.enums.SysUserTypeEnum;
import com.yaorange.common.exception.ServiceException;
import com.yaorange.common.utils.DictUtils;
import com.yaorange.common.utils.SecurityUtils;
import com.yaorange.common.utils.StringUtils;
import com.yaorange.system.service.ISysUserService;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

@Service
public class NjtCommonService {
    @Autowired
    private INjtUserPerfectService userPerfectService;
    @Autowired
    private INjtUserRegisterService userRegisterService;
    @Autowired
    private INjtUnitConfigService njtUnitConfigService;
    @Autowired
    private ISysUserService sysUserService;
    @Value("${ruoyi.uploadType}")
    private String uploadType;
    /**
     * 根据用户，组装筛选条件 ---合格证打印列表
     * 普通用户：查看自己的
     * 监管者：查看监管范围内的
     * 管理员：查询所有
     *
     * @param njtCertificate 查询参数对象
     */
    @Transactional(readOnly = true)
    public void getAuthNjtCertificate(NjtCertificateVo njtCertificate) {
        // 获取当前登录用户
        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
        String userType = sysUser.getUserType();
        if (SysUserTypeEnum.ADMIN.CODE.equals(userType)) {
            // 管理员查询所有，直接放行
            return;
        }
        if (SysUserTypeEnum.COMMON.CODE.equals(userType)) {
            // 如果是普通用户,只查看自己的
            njtCertificate.setUserId(sysUser.getUserId());
        } else if (SysUserTypeEnum.REGULATOR.CODE.equals(userType)) {
            NjtUserPerfect perfect = userPerfectService.getByRegisterUserId(sysUser.getUserId());
            // 如果是监管者,查询监管范围内的数据
            if (null == perfect.getUnitId()) {
                // 单位配置信息获取失败，无查看权限
                throw new ServiceException("单位信息获取失败，请确认所属单位是否有误");
            }
            // 监管者查询监管范围内的数据
            NjtUnitConfig unitConfig = njtUnitConfigService.selectNjtUnitConfigById(perfect.getUnitId());
            if (null == unitConfig) {
                // 单位配置信息获取失败，无查看权限
                throw new ServiceException("单位信息获取失败，请确认所属单位是否有误");
            } else {
                // 设置能查看的区域数据
                NjtUserPerfect njtUserPerfect = new NjtUserPerfect();
                njtUserPerfect.setProvince(unitConfig.getProvince());
                njtUserPerfect.setCity(unitConfig.getCity());
                njtUserPerfect.setArea(unitConfig.getArea());
                njtCertificate.setUserPerfect(njtUserPerfect);
            }
        } else {
            throw new ServiceException("无查看权限");
        }
    }

    /**
     * 获取单位名称
     *
     * @param loginUser 登录用户
     * @return 单位名称
     */
    public String getUnitName(LoginUser loginUser) {
        String result = null;
        SysUser user = loginUser.getUser();
        // 获取当前登录用户的会员信息
        NjtUserPerfect perfect = userPerfectService.getByRegisterUserId(user.getUserId());
        if (ObjectUtils.isEmpty(perfect)) {
            //获取默认的 数据字典中的 公司名称
            result = DictUtils.getDictValue(NjtConstants.SYS_CONFIG , NjtConstants.SYS_NAME);
        } else {
            // 获取当前登录用户的单位配置信息
            NjtUnitConfig unitConfig = njtUnitConfigService.selectNjtUnitConfigById(perfect.getUnitId());
            if (ObjectUtils.isNotEmpty(unitConfig)) {
                result = unitConfig.getUnit();
            }
        }
        //还是没有，就用默认公司名字
        if (StringUtils.isBlank(result)) {
            result = NjtConstants.DEFAULT_COMPANY_NAME;
        }
        return result;
    }

    /**
     * 检查用户所在单位里是否开启指定的配置的权限
     *
     * @param sysUser    当前登录用户
     * @param configType 配置项
     * @return false 无，true 有
     */
    public boolean hasConfigAuth(LoginUser sysUser, String configType) {
        NjtUserPerfect perfect = userPerfectService.getByRegisterUserId(sysUser.getUserId());
        if (null == perfect) {
            return false;
        }
        Long unitId = perfect.getUnitId();

        if (null == unitId) {
            return false;
        }
        NjtUnitConfig unitConfig = njtUnitConfigService.selectNjtUnitConfigById(unitId);
        if (StringUtils.isEmpty(unitConfig.getConfigItem())) {
            return false;
        }
        // 比如：1,2,3,4,5,6,7,8 是否包含 1
        return unitConfig.getConfigItem().contains(configType);
    }

    /**
     * 上传文件，默认文件名
     *
     * @param file
     * @return
     */
    public String uploadFile(MultipartFile file, String bizPath) {
        return this.uploadFile(file, bizPath, null);
    }

    /**
     * 文件上传
     *
     * @param file     上传文件
     * @param bizPath  自定义文件上传路径
     * @param fileName 自定义文件名
     * @return
     */
    public String uploadFile(MultipartFile file, String bizPath, String fileName) {
        if (StringUtils.isBlank(fileName)) {
            fileName = FileUploadUtils.getFileName(file);
        }
        // 文件上传成功后地址
        String url;
//        if (NjtConstants.UPLOAD_TYPE_QINIU.equals(uploadType)) {
//            // 上传到七牛云
//            url = QiniuUtils.upload(file, fileName);
//        } else {
//            // 上传到本地
        url = FileUploadUtils.uploadLocal(file, bizPath, fileName);
//        }
        return url;
    }

    /**
     * 获取当前登录用户信息
     *
     * @return
     */
    public NjtLoginUser getLoginUser() {
        // 当前登录系统用户
        LoginUser sysUser = SecurityUtils.getLoginUser();
        if (sysUser == null) {
            throw new ServiceException("当前登录信息查询失败");
        }
        // 查询最新的系统用户信息，避免前端更新用户信息后，未重新登录导致数据未刷新情况
        SysUser user = sysUserService.selectUserById(sysUser.getUserId());
        if (null != user) {
            sysUser.setUser(user);
        }
        NjtLoginUser loginUser = new NjtLoginUser();
        loginUser.setSysUser(sysUser);
        // 查询会员注册信息
        NjtUserRegister userRegister = userRegisterService.getByMobilePhone(sysUser.getUsername());
        if (null != userRegister) {
            loginUser.setUserRegister(userRegister);
            Long userId = userRegister.getId();
            NjtUserPerfect userPerfect = userPerfectService.getByRegisterUserId(userId);
            if (null != userPerfect) {
                loginUser.setUserPerfect(userPerfect);
            }
        }
        return loginUser;
    }

    /**
     * 检查当前登录用户是否是会员
     *
     * @param loginUser
     * @return 返回null表示检查通过
     */
    public void checkUserStatus(NjtLoginUser loginUser) {
        NjtUserRegister userRegister = loginUser.getUserRegister();
        NjtUserPerfect userPerfect = loginUser.getUserPerfect();
        LoginUser sysUser = loginUser.getSysUser();
        if (null == sysUser.getUser() || null == sysUser.getUser().getUserType()) {
            throw new ServiceException("当前登录用户信息有误");
        }
        if (!SysUserTypeEnum.COMMON.CODE.equals(sysUser.getUser().getUserType())) {
            // 只有普通用户才检查会员状态,非普通用户直接通过
            return;
        }
        if (null == userPerfect || null == userRegister) {
            throw new ServiceException("会员信息查询失败，请确保是否已完成会员认证");
        }
        // 用户状态被禁用
        if (YesOrNoEnum.NO.getCode() == userRegister.getUserStatus()) {
            throw new ServiceException("会员状态有误，请联系管理员");
        }
        // 用户信息已完善，但未审核通过。只有已完善信息并且
        if (userRegister.getMemberFlag() == YesOrNoEnum.NO.getCode()) {
            throw new ServiceException("您还不是会员，请确保用户信息已完善并审核通过");
        }
    }
}
